home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok58.lha / NPrint / txt / StringOps.mod < prev    next >
Text File  |  1993-08-15  |  6KB  |  272 lines

  1. (**********************************************************************
  2.  
  3.     :Program.    StringOps.mod
  4.     :Contents.   string operations, replaces the standard module "Strings".
  5.     :Author.     Nicolas Benezan [bne]
  6.     :Address.    Postwiesenstr. 2, D7000 Stuttgart 60
  7.     :Phone.      711/333679
  8.     :Copyright.  Public Domain
  9.     :Language.   Modula-2
  10.     :Translator. M2Amiga A+L V3.2d
  11.     :History.    V1.0b [bne] 18.Apr.1989
  12.  
  13. **********************************************************************)
  14.  
  15. IMPLEMENTATION MODULE StringOps;
  16.  
  17. CONST
  18.   nul=CHAR(0);
  19.  
  20. PROCEDURE Append(VAR String:ARRAY OF CHAR;
  21.                      Tail:ARRAY OF CHAR);
  22.   VAR
  23.     PosStr,PosTail:INTEGER;
  24.   BEGIN
  25.     PosTail:=0;
  26.     PosStr:=Length(String);
  27.     LOOP
  28.       IF PosStr>HIGH(String) THEN
  29.         EXIT
  30.       ELSIF (PosTail>HIGH(Tail)) OR (Tail[PosTail]=nul) THEN
  31.         String[PosStr]:=nul;
  32.         EXIT
  33.       END;
  34.       String[PosStr]:=Tail[PosTail];
  35.       INC(PosStr);
  36.       INC(PosTail);
  37.     END;
  38.   END Append;
  39.  
  40. PROCEDURE AppendChar(VAR String:ARRAY OF CHAR;
  41.                          Char:CHAR);
  42.   VAR
  43.     Len:INTEGER;
  44.   BEGIN
  45.     Len:=Length(String);
  46.     IF Len<=HIGH(String) THEN
  47.       String[Len]:=Char;
  48.       IF Len<HIGH(String) THEN
  49.         String[Len+1]:=nul;
  50.       END;
  51.     END;
  52.   END AppendChar;
  53.  
  54. PROCEDURE Assign(    Source:ARRAY OF CHAR;
  55.                  VAR Destination:ARRAY OF CHAR);
  56.   VAR
  57.     Pos,Max:INTEGER;
  58.   BEGIN
  59.     Max:=HIGH(Source);
  60.     IF HIGH(Destination)<Max THEN
  61.       Max:=HIGH(Destination);
  62.     END;
  63.     Pos:=0;
  64.     LOOP
  65.       Destination[Pos]:=Source[Pos];
  66.       INC(Pos);
  67.       IF (Pos>Max) OR (Source[Pos]=nul) THEN
  68.         IF Pos<=HIGH(Destination) THEN
  69.           Destination[Pos]:=nul;
  70.         END;
  71.         EXIT
  72.       END;
  73.     END;
  74.   END Assign;
  75.  
  76. PROCEDURE CapChar(VAR Char:CHAR);
  77.   BEGIN
  78.     CASE Char OF
  79.      |"a".."z", "à".."ö", "ø".."þ": DEC(Char,32);
  80.     ELSE
  81.     END;
  82.   END CapChar;
  83.  
  84. PROCEDURE CapString(VAR String:ARRAY OF CHAR);
  85.   VAR
  86.     Pos:INTEGER;
  87.   BEGIN
  88.     Pos:=0;
  89.     WHILE (Pos<=HIGH(String)) AND (String[Pos]#nul) DO
  90.       CapChar(String[Pos]);
  91.       INC(Pos);
  92.     END;
  93.   END CapString;
  94.  
  95. PROCEDURE FindChar(String:ARRAY OF CHAR;
  96.                    Char:CHAR;
  97.                    Start:INTEGER):INTEGER;
  98.   VAR
  99.     Step:INTEGER;
  100.   BEGIN
  101.     IF Start<0 THEN
  102.       Start:=-Start;
  103.       Step:=-1;
  104.     ELSE
  105.       Step:=1;
  106.     END;
  107.     WHILE (Start<=HIGH(String)) AND (Start>=0) AND (String[Start]#nul) DO
  108.       IF String[Start]=Char THEN
  109.         RETURN Start
  110.       END;
  111.       INC(Start,Step);
  112.     END;
  113.     RETURN -1;
  114.   END FindChar;
  115.  
  116. PROCEDURE Concat(    Head:ARRAY OF CHAR;
  117.                      Tail:ARRAY OF CHAR;
  118.                  VAR String:ARRAY OF CHAR);
  119.   BEGIN
  120.     Assign(Head,String);
  121.     Append(String,Tail);
  122.   END Concat;
  123.  
  124. PROCEDURE DeleteSubString(VAR String:ARRAY OF CHAR;
  125.                               Start,Len:INTEGER);
  126.   BEGIN
  127.     INC(Len,Start);
  128.     WHILE Len<=HIGH(String) DO
  129.       String[Start]:=String[Len];
  130.       IF String[Len]=nul THEN
  131.         RETURN
  132.       END;
  133.       INC(Start);
  134.       INC(Len);
  135.     END;
  136.     IF Start<=HIGH(String) THEN
  137.       String[Start]:=nul;
  138.     END;
  139.   END DeleteSubString;
  140.  
  141. PROCEDURE FindSubString(String:ARRAY OF CHAR;
  142.                         SubString:ARRAY OF CHAR;
  143.                         Start:INTEGER):INTEGER;
  144.   VAR
  145.     Pos,Max:INTEGER;
  146.   BEGIN
  147.     Pos:=0;
  148.     Max:=HIGH(String)-Length(SubString)+1;
  149.     WHILE (String[Start]#nul) AND (Start<=Max) DO
  150.       LOOP
  151.         IF (Pos>HIGH(SubString)) OR (SubString[Pos]=nul) THEN
  152.           RETURN Start
  153.         END;
  154.         IF String[Start+Pos]#SubString[Pos] THEN
  155.           Pos:=0;
  156.           EXIT
  157.         END;
  158.         INC(Pos);
  159.       END;
  160.       INC(Start);
  161.     END;
  162.     RETURN -1;
  163.   END FindSubString;
  164.  
  165. PROCEDURE ShiftRight(VAR String:ARRAY OF CHAR;
  166.                          Position, Distance: INTEGER);
  167.   VAR
  168.     Start,End:INTEGER;
  169.   BEGIN
  170.     End:=Length(String)+Distance;
  171.     IF End>HIGH(String) THEN
  172.       End:=HIGH(String);
  173.     END;
  174.     FOR Start:=End-Distance TO Position BY -1 DO
  175.       String[End]:=String[Start];
  176.       DEC(End);
  177.     END;
  178.   END ShiftRight;
  179.  
  180. PROCEDURE InsertSubString(VAR String:ARRAY OF CHAR;
  181.                               SubString:ARRAY OF CHAR;
  182.                               Position:INTEGER);
  183.   BEGIN
  184.     ShiftRight(String,Position,Length(SubString));
  185.     OverWrite(String,SubString,Position);
  186.   END InsertSubString;
  187.  
  188. PROCEDURE InsertChar(VAR String:ARRAY OF CHAR;
  189.                          Char:CHAR;
  190.                          Position:INTEGER);
  191.   BEGIN
  192.     ShiftRight(String,Position,1);
  193.     String[Position]:=Char;
  194.   END InsertChar;
  195.  
  196. PROCEDURE Length(String:ARRAY OF CHAR):INTEGER;
  197.   VAR
  198.     Len:INTEGER;
  199.   BEGIN
  200.     Len:=0;
  201.     WHILE (Len<=HIGH(String)) AND (String[Len]#nul) DO
  202.       INC(Len);
  203.     END;
  204.     RETURN Len;
  205.   END Length;
  206.  
  207. PROCEDURE OverWrite(VAR String:ARRAY OF CHAR;
  208.                         Overlay:ARRAY OF CHAR;
  209.                         Position:INTEGER);
  210.   VAR
  211.     Pos,Len:INTEGER;
  212.   BEGIN
  213.     Len:=Length(Overlay);
  214.     DEC(Len);
  215.     IF Position+Len>HIGH(String) THEN
  216.       Len:=HIGH(String)-Position;
  217.     END;
  218.     FOR Pos:=0 TO Len DO
  219.       String[Position]:=Overlay[Pos];
  220.       INC(Position);
  221.     END;
  222.   END OverWrite;
  223.  
  224. PROCEDURE SubString(    Source:ARRAY OF CHAR;
  225.                     VAR Destination:ARRAY OF CHAR;
  226.                         Position,Len:INTEGER);
  227.   VAR
  228.     SrcLen,Pos:INTEGER;
  229.   BEGIN
  230.     SrcLen:=Length(Source);
  231.     IF Position+Len>SrcLen THEN
  232.       Len:=SrcLen-Position;
  233.     END;
  234.     FOR Pos:=0 TO Len-1 DO
  235.       Destination[Pos]:=Source[Position];
  236.       INC(Position);
  237.     END;
  238.     IF Len<=HIGH(Destination) THEN
  239.       Destination[Len]:=nul;
  240.     END;
  241.   END SubString;
  242.  
  243. PROCEDURE Compare(String1,String2:ARRAY OF CHAR):INTEGER;
  244.   VAR
  245.     Max,Max1,Max2,Res,Pos,Diff:INTEGER;
  246.   BEGIN
  247.     Max1:=HIGH(String1);
  248.     Max2:=HIGH(String2);
  249.     Res:=Max1-Max2;
  250.     IF Res<0 THEN
  251.       Max:=Max1;
  252.     ELSE
  253.       Max:=Max2;
  254.     END;
  255.     FOR Pos:=0 TO Max DO
  256.       Diff:=ORD(String1[Pos])-ORD(String2[Pos]);
  257.       IF (Diff#0) OR (String1[Pos]=nul) THEN
  258.         RETURN Diff
  259.       END;
  260.     END;
  261.     INC(Max);
  262.     IF (Res<0) AND (String2[Max]#nul) THEN
  263.     ELSIF (Res>0) AND (String1[Max]#nul) THEN
  264.     ELSE
  265.       RETURN 0;
  266.     END;
  267.     RETURN Res;
  268.   END Compare;
  269.  
  270. END StringOps.
  271.  
  272.